-- 2022-7-28

---[[
    -- 注意在lua中读写文件的时候，要注意读写文件所在的文件和终端的位置，终端只能在子文件寻找，可以调整文件的位置也可以输入完整路径

    -- 由于Lua语言强调可移植性和嵌入性，所以Lua语言本身并没有提供太多与外部交互的机制
    -- 在真实的Lua程序中，大多数I/O操作，要么由宿主程序实现，要么通过不包括在发行版的外部库实现
    -- 单就Lua语言，只提供了ISO C语言标准支持的功能
    --     国际标准化组织为了提高C语言的移植性而设立的C语言标准

    -- 对于文件操作来说，I/O库提供了两种不同的模型
    --     简单I/O模型
    --     完整I/O模型
    
    -- 简单I/O模型
    --     当前输入流
    --     当前输出流
    --     其I/O操作是通过这些流实现的，I/O库把当前输入流初始化为进程的标准输入(C语言中的stdin)，将当前输出流初始化为进程的标准输出(C语言中的stdout)
    --     因此执行io.read这样的语句是，就可以从标准输入中读取一行
    --        print(io.read())
        
    -- 函数io.input 和 io.output可以用于改变当前的输入输出流
    -- 调用io.input(filename)会以只读模式打开指定文件，并将文件设置为当前输入流
    -- 之后，所有的输入都将来自此文件，除非再次调用io.input
    -- 对于输出而言，函数io.input的逻辑与之类似
    -- 如果出现错误，这两个函数都会抛出异常
    -- 要想直接处理这些异常，则必须使用完整I/O模型
    
    -- io.write 可以读取任意数量的字符串或数字，并将其写入放弃输出流
    -- 由于调用该函数时可以使用多个参数，因此应该避免使用io.write(a..b..c),应该使用io.write(a,b,c),后者可以用更少的资源达到相同效果
    
    -- 作为原则，应该只在“先用后弃”的代码或调试代码中使用函数print；当需要完全控制输出时，应该使用函数io.write
    -- 与函数print不同，函数io.write不会在最终输出结果在添加诸如制表符或换行符这样的额外内容
    -- io.write 允许对输出进行重定向，而print只能使用标准输出
    -- print会为其参数自动tostring 十分便利 但也容易导致一些bug

    -- 函数io.write在将数值转换为字符串时遵循一般规则，如果想要完全的控制这种转换，应该使用string.format

    -- 函数io.read可以从当前输入流中读取字符串 其参数决定了要读取的数据
    --      "a" 读取整个文件
    --      "l" 读取下一行(丢弃换行符)
    --      "L" 读取下一行(保留换行符)
    --      "n" 读取一个数值
    --      num 以字符串形式读取n个字符
    -- 调用io.read("a")可以从当前位置开始读取当前输入文件的全部内容，如果当前位置处于文件的末尾或文件为空，那么该函数返回一个空字符串
    -- Lua语言可以高效的处理长字符串 所以在Lua语言中编写过滤器filter的一种简单技巧就是将整个文件读取到一个字符串中，然后对字符串进行处理
    
    -- filepath = ".vscode\\code\\7\\test.lua"
    -- -- 简单的读写操作
    -- File = io.open(filepath,"r")
    -- io.input(File)
    -- print(io.read("a"))
    -- io.close(File)

    -- File = io.open(filepath,"a")
    -- io.output(File)
    -- io.write("-- test.lua 文件末尾注释")
    -- io.close(File)

    -- 调用io.read("l")会返回当前输入流的下一行，不包括换行符在内；参数"L"与之相似，但包括换行符
    -- 到达文件末尾时返回nil
    -- "l"是函数read的默认参数
    -- 如果要逐行迭代一个文件，那么使用io.lines迭代器会更简单

    -- 对文件进行排序的程序
    -- File = io.open(filepath,"r+")
    -- io.input(File)
    -- io.output(File)
    -- local lines = {}
    -- for line in io.lines() do
    --     lines[#lines+1] = line
    -- end
    -- table.sort(lines)
    -- for index, value in ipairs(lines) do
    --     io.write("\n",value)
    -- end

    -- io.read() 参数为n时，会从当前输入流中读取一个数值，这也是函数read返回值为数值(整型或浮点型)而非字符串的唯一情况
    -- 如果在跳过了空格之后，函数io.read仍然不能读取到数值 返回nil
    -- 还可以 以参数 n ，读取n个字符，如果无法读取到任何字符则返回nil，否则返回字符串
    
    -- io.read(0)是一个特例，它常用于测试是否到达了文件末尾
    -- 如果仍然有数据可供读取，他会返回一个空字符串；否则，返回nil

    -- 调用函数read可以同时指定多个参数，函数会根据每个参数返回相应的结果
    -- 假设有一个每行由三个数字组成的文件,输出最大值
    -- file = io.open(filepath,"r")
    -- io.input(file)
    -- local n1,n2,n3 = io.read("n","n","n")
    -- print(n1,n2,n3)
    -- print(math.max(n1,n2,n3))
--]]